const Ajv = require('ajv')
const localize = require('ajv-i18n')
const schema = {
  type: 'object', // 验证 validate 的参数是一个 object
  properties: {
    name: {
      type: 'string',
      // test: true,
      // test: false, // 自动加 minLength: 10, ajv-errors 不支持自定义关键字
      errorMessage: {
        type: '必须是字符串',
        minLength: '长度不能小于10'
      },
      minLength: 5
    },
    age: {
      type: 'string',
    },
    pets: {
      type: 'array',
      // items: {
      //   type: 'string'
      // }
      items: [  // 表示 pets 只有两个元素，且第一个是 string，第二个是 number
        { type: 'string' },
        { type: 'number' }
      ]
    },
    isWorker: {
      type: 'boolean'
    }
  },
  required: ['name', 'age']
}

const ajv = new Ajv({ allErrors: true, jsonPointers: true })
require('ajv-errors')(ajv)

ajv.addKeyword('test', {
  // macro() {
  //   return {
  //     minLength: 10,// 自动加 minLength: 10,
  //   }
  // },
  // validate(schema, data) {
  //   // schema：配置的值, data：填的值
  //   // console.log(schema, data);//true she293030lley@qq.com
  //   if (schema === true) return true;
  //   else return schema.length === 6
  // }
  // compile(sch, parentSchema) {
  //   console.log(sch, parentSchema);//false { type: 'string', test: false }
  //   // TypeError: Cannot create property 'errors' on boolean 'true'
  //   // return true;
  //   return () => true
  // },
  // metaSchema: {
  //   type: 'boolean'
  // },
})

const validate = ajv.compile(schema)
const valid = validate({
  name: 'shelley',
  age: '22',
  pets: [
    'mimi',
    11
  ],
  isWorker: true,
})
if (!valid) {
  localize.zh(validate.errors)// 中文化
  console.log(validate.errors);// 输出结果
}

/**
[
  {
    keyword: 'minLength',
    dataPath: '.name',
    schemaPath: '#/properties/name/minLength',
    params: { limit: 10 },
    message: '不应少于 10 个字符'
  },
  {
    keyword: 'test',
    dataPath: '.name',
    schemaPath: '#/properties/name/test',
    params: { keyword: 'test' },
    message: '应当通过 "test 关键词校验"'
  }
]

 */